/**
 * ts为了让js变的更严格 （）
 * 错误前置：
 */
// 基本类型 / 引用类型
// void 空
// any 任意类型
// never 错误类型

const str = '123';
let num: string | number = '123';
num = 456;

let boo: boolean | number | string = true;
boo = 123
let n = null;


// 引用类型 <数组/{}/函数>

// 接口
// interface ArrPropsType {

// }

// type
type ArrPropsType = string | number | null | boolean
// 控制数组内部的值
const arr: ArrPropsType[] = []
arr.push(1)
arr.push('string')
arr.push('null')
arr.push(true)
arr.push(false)
// 类型推断：基于已经存在的值，可以推断出他的数据类型
// 元组 : 一一对应类型和值
// const brr: [number,number,number, string, boolean, boolean] = [1,2,3, 'str', true, false]

interface OptProps {
  name: string,
  age: number,
  gender: number,
  address: string
}
const option: OptProps = {
  name: 'devin',
  age: 12,
  gender: 1,
  address: '用户个人信息'
}

// 函数：参数 要做注解; 函数返回值要注解

// interface ParamsProps {
//   page: string,
//   size: number
// }

// function auto(params: ParamsProps): string {
//   return '123'
// }
// auto({page: '123', size: 12})


// 泛型
function PersonInfo<T>(info:T) {
  console.log('info:', (info as any).name) // 断言
}

PersonInfo(option)

// class Header extends Component

interface TProps {
  name: string
}

class Person<T extends TProps, S> {
 name:string
 constructor(props: T) {
   this.name = props.name
 }
}
type PropsType = {
  name: string
}
let p = new Person({name: 'devin'})

// 定义的时候，注解清楚（调用的时候，就有可能出现传递参数不明确的问题）

function identity <T> (arg: Array<T>): Array<T> {
  return arg;
}

// let output = identity<string>(");
